package main

import (
	"context"
	"fmt"
	"time"

	"golang.org/x/time/rate"
)

func main() {
	limiter := rate.NewLimiter(10, 100)

	// 一直等到获取到桶中的令牌
	err := limiter.Wait(context.Background())
	if err != nil {
		fmt.Println("error:", err)
	}

	// 设置1秒的等待超时时间
	// ctx, _ := context.WithTimeout(context.Background(), time.Second*1)
	// err = limiter.Wait(ctx)
	// if err != nil {
	// 	fmt.Println("error:", err)
	// }

	// AllowN 方法表示: 截止到某一个时刻, 目前桶中的至少为n个, 满足则返回true, 并且从桶中消费n个token. 如果不满足则返回false
	if limiter.AllowN(time.Now(), 2) {
		fmt.Println("event allowed")
	} else {
		fmt.Println("event not allowed")
	}

	r := limiter.Reserve()
	if r.OK() {
		return
	}
	time.Sleep(r.Delay())

}
